package com.principles.behavior.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description 观察者模式（或 发布订阅模式）——定义了对象间的依赖关系，一对多
 *                                        定义对象间的一种一对多依赖关系，使得每当一个对象的状态发生改变时，其相关依赖对象皆得到通知并被自动更新
 * @Date 2025/1/27 20:41
 **/
public class ObserverPattern {
    public static void main(String[] args) {
        ZhangSan zhangSan = new ZhangSan();
        zhangSan.borrow(new WangWu());
        zhangSan.borrow(new LiSi());
        // 张三有钱后 通知
        zhangSan.notifyCredits();

    }
}
// 贷款人 和 债主的关系 贷款人有钱后，通知债主让他们来找我要钱

// 贷款人   主题对象
interface Debit{
    // 去借钱
    void borrow(Credit credit);

    // 通知债主来拿钱
    void notifyCredits();
}
class ZhangSan implements Debit{

    // 债主们
    private List<Credit> allCredit = new ArrayList<>();
    @Override
    public void borrow(Credit credit) {
        allCredit.add(credit);
    }

    @Override
    public void notifyCredits() {
        allCredit.forEach(credit -> credit.takeMoney());
    }
}

// 债主    观察者
interface Credit{
    // 要钱
    void takeMoney();
}
class LiSi implements Credit{

    @Override
    public void takeMoney() {
        System.out.println("李四要钱");
    }
}

class WangWu implements Credit{

    @Override
    public void takeMoney() {
        System.out.println("王五要钱");
    }
}